home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Plus Special 20
/
AMIGAplus Sonderheft 20 (1999)(ICP)(DE)[!].iso
/
PublicDomain
/
Spiele
/
Aniso
/
Aniso.s
< prev
next >
Wrap
Text File
|
1999-01-01
|
14KB
|
828 lines
; Aniso - a small puzzle game
; Copyright 1992 Barry McConnell
; Set TAB stops to 10!
include exec/exec_lib.i
include exec/execbase.i
include exec/memory.i
include intuition/intuition_lib.i
include dos/dos_lib.i
include dos/dosextens.i
include graphics/graphics_lib.i
include libraries/gadtools_lib.i
include graphics/gfxbase.i
include intuition/intuition.i
include libraries/gadtools.i
CALLGAD MACRO
move.l _GadBase,a6
jsr _LVO\1(a6)
ENDM
SECTION Aniso,CODE
movem.l d0/a0,-(a7)
clr.l ReturnMsg
movea.w #0,a1
CALLEXEC FindTask
movea.l d0,a4
tst.l pr_CLI(a4) started from WB or CLI?
bne.s SkipWB
lea pr_MsgPort(a4),a0
CALLEXEC WaitPort
lea pr_MsgPort(a4),a0
CALLEXEC GetMsg
move.l d0,ReturnMsg save it for later reply
SkipWB movem.l (a7)+,d0/a0
bsr.s Main
move.l d0,-(a7) save exit code
tst.l ReturnMsg started from CLI?
beq.s End
CALLEXEC Forbid
move.l ReturnMsg,a1
CALLEXEC ReplyMsg
End move.l (a7)+,d0
rts
Main lea IntName,a1
moveq.l #37,d0
CALLEXEC OpenLibrary
tst.l d0
beq end
move.l d0,_IntuitionBase
lea DosName,a1
moveq.l #37,d0
CALLEXEC OpenLibrary
tst.l d0
beq closeint
move.l d0,_DOSBase
lea GadName,a1
moveq.l #37,d0
CALLEXEC OpenLibrary
tst.l d0
beq closedos
move.l d0,_GadBase
lea GfxName,a1
moveq.l #37,d0
CALLEXEC OpenLibrary
tst.l d0
beq closegad
move.l d0,_GfxBase
movea.l d0,a0
move.l gb_DefaultFont(a0),a1
move.l a1,SysFont
lea DefFont,a2
move.l LN_NAME(a1),(a2)+
move.w tf_YSize(a1),(a2)
movea.w #0,a0
CALLINT LockPubScreen
tst.l d0
beq closegfx
move.l d0,PubScr
movea.l d0,a3
move.l sc_Font(a3),a0
CALLGRAF OpenFont
tst.l d0
beq unlock
move.l d0,ScrFont
move.l d0,a1
CALLGRAF CloseFont
movea.l a3,a0
movea.w #0,a1
CALLGAD GetVisualInfoA
tst.l d0
beq unlock
move.l d0,VisInfo
Init movea.l SysFont,a0
movea.l ScrFont,a1
move.w tf_XSize(a0),d3 width of system default font
move.w tf_YSize(a0),d4 height of system default font
move.w tf_YSize(a1),d5 height of default screen font
move.w d5,sfsize
move.w Size,d2
move.w d2,d0
mulu #6,d0
addi.w #9,d0
mulu d3,d0
addi.w #36,d0
move.w d2,d1
mulu #8,d1
add.w d1,d0
move.l d0,winwidth
move.w d2,d0
addq.w #1,d0
mulu d4,d0
addi.w #27,d0
move.w d2,d1
mulu #10,d1
add.w d1,d0
add.w d5,d0 allow room for title bar
move.l d0,winheight
move.w d2,d0
mulu d0,d0
add.w d0,d0
move.l d0,d6
addi.w #4,d0
mulu #30,d0 30 bytes per NewGadget structure
move.l d0,Mem1
move.l #MEMF_ANY!MEMF_CLEAR,d1
CALLEXEC AllocMem
tst.l d0
beq freevi
move.l d0,GadMem
move.l d6,d0
add.w d0,d0
move.l d0,Mem2
move.l #MEMF_ANY!MEMF_CLEAR,d1
CALLEXEC AllocMem
tst.l d0
beq freegmem
move.l d0,TextMem
move.w d3,d0
mulu #3,d0
addq.w #4,d0 width of one gadget
move.w d0,width
mulu d2,d0
move.w d0,nwidth width of n gadgets
move.w d4,d0
addi.w #10,d0 height of one gadget
move.w d0,height
mulu d2,d0 height of n gadgets
move.w d0,nheight height of n gadgets
move.w d2,d0
mulu d0,d0
add.w d0,d0 memory taken by text by n*n buttons
move.w d0,ntext
move.w Size,d5
mulu d5,d5
mulu #30,d5 memory taken by n*n NewGadgets
movea.l GadMem,a0
movea.l TextMem,a1
moveq.w #10,d1 gadget ID
clr.w d7 row counter
row clr.w d6 column counter
column movem.l a0-a1,-(a7)
move.w width,d0
mulu d6,d0
addq.w #8,d0
move.w d0,(a0) left (text)
add.w nwidth,d0
addi.w #10,d0
move.w d0,0(a0,d5) left (button)
adda.w #2,a0
move.w height,d0
mulu d7,d0
addq.w #7,d0
add.w sfsize,d0
move.w d0,(a0) top (text)
move.w d0,0(a0,d5) top (button)
adda.w #2,a0
move.w width,d0
subq.w #4,d0
move.w d0,(a0) width (text)
move.w d0,0(a0,d5) width (button)
adda.w #2,a0
move.w height,d0
subq.w #4,d0
move.w d0,(a0) height (text)
move.w d0,0(a0,d5) height (button)
adda.w #2,a0
move.l a1,(a0) text (text)
adda.w ntext,a1
move.l a1,0(a0,d5) text (button)
adda.w #4,a0
lea DefFont,a2
move.l a2,(a0) Default Font (text)
move.l a2,0(a0,d5) Default Font (button)
adda.w #4,a0
move.w d1,(a0) ID (text)
move.w d2,d0
mulu d0,d0
add.w d1,d0
move.w d0,0(a0,d5) ID (button)
adda.w #2,a0
addq.w #1,d1
moveq.l #PLACETEXT_IN,d0
move.l d0,(a0) flags (text)
move.l d0,0(a0,d5) flags (button)
adda.w #4,a0
move.l VisInfo,d0
move.l d0,(a0) Visual Info (text)
move.l d0,0(a0,d5) Visual Info (button)
adda.w #4,a0
move.l #TEXT_KIND,(a0) user data (text)
move.l #BUTTON_KIND,0(a0,d5) user data (button)
movem.l (a7)+,a0-a1
adda.w #30,a0
adda.w #2,a1
addq.b #1,d6
cmp.b d2,d6
bne column
addq.b #1,d7
cmp.b d2,d7
bne row
adda.l d5,a0
movea.l a0,a1
lea Buttons,a0
move.w nheight,d0
add.w #15,d0
add.w sfsize,d0
move.w d0,2(a0) top
move.w d0,32(a0)
move.w d0,62(a0)
move.w d3,d0
mulu #8,d0
move.w d0,d6
move.w d0,4(a0) width
move.w d0,34(a0)
move.w d0,64(a0)
move.w d4,d0
addq.w #6,d0
move.w d0,6(a0) height
move.w d0,36(a0)
move.w d0,66(a0)
move.w d0,96(a0)
move.l VisInfo,d0
move.l d0,22(a0) VisualInfo
move.l d0,52(a0)
move.l d0,82(a0)
move.l d0,112(a0)
move.w d2,d0
mulu #6,d0
subi.w #15,d0
mulu d3,d0
add.w #20,d0
move.w d2,d1
mulu #8,d1
add.w d1,d0
ror.l #1,d0 distance between each button
move.w d6,d1
addi.w #8,d1
add.w d0,d1
move.w d1,30(a0) left (2nd button)
add.w d6,d1
add.w d0,d1
move.w d1,60(a0) left (3rd button)
move.w nwidth,d0
add.w d0,d0
addi.w #28,d0
move.w d0,90(a0) left (cycle)
move.w height,d0
addq.w #7,d0
add.w sfsize,d0
move.w d0,92(a0) top (cycle)
move.w d3,d0
mulu #9,d0
move.w d0,94(a0) width (cycle)
moveq.l #120,d0
CALLEXEC CopyMem
move.w Size,d0
move.w d0,SizeCopy
subq.w #3,d0
move.l d0,CycActive
bsr Shuffle
lea glist,a0
CALLGAD CreateContext
tst.l d0
beq freetmem
movea.l d0,a0
movea.l GadMem,a1
move.w Size,d2
mulu d2,d2
add.w d2,d2
addi.w #4,d2
lea Tag1,a2
clr.l FirstBox
clr.l FirstBut
gadloop move.l 26(a1),d0 kind
move.l d0,-(a7)
movea.l a1,a5
cmpi.w #4,d2
bne nochange
lea Tag2,a2
nochange CALLGAD CreateGadgetA
tst.l d0
bne createok
move.l (a7)+,d0
bra freegads
createok movea.l a5,a1
adda.w #30,a1
movea.l d0,a0
tst.l FirstBox
bne notbox
move.l a0,FirstBox
notbox move.l (a7)+,d0
cmpi.l #BUTTON_KIND,d0
bne notbutton
tst.l FirstBut
bne notbutton
move.l a0,FirstBut
notbutton subq.w #1,d2
bne gadloop
move.l d0,CycleGad
movea.w #0,a0
lea WinTags,a1
CALLINT OpenWindowTagList
tst.l d0
beq freegads
move.l d0,MyWindow
movea.l d0,a0
move.l wd_UserPort(a0),MyIdcmp
movea.l MyWindow,a0
CALLINT ActivateWindow
sleep movea.l MyIdcmp,a0
CALLEXEC WaitPort
loop movea.l MyIdcmp,a0
CALLGAD GT_GetIMsg something happened!
tst.l d0
beq sleep received all messages
movea.l d0,a1
move.l im_Class(a1),d3 what exactly happened?
move.w im_Qualifier(a1),d4 with what?
move.w im_Code(a1),d5 its code
movea.l im_IAddress(a1),a2 and to what?
CALLGAD GT_ReplyIMsg
cmpi.l #CLOSEWINDOW,d3
bne noclose
finish move.w #1,Terminate
bra closewind
noclose cmpi.l #VANILLAKEY,d3
bne nokey
cmpi.w #"n",d5
beq new
cmpi.w #"r",d5
beq retry
cmpi.w #"q",d5
beq finish
bra loop
nokey move.w gg_GadgetID(a2),d0
cmpi.w #200,d0
bge button
cmpi.w #10,d0
blt loop
move.w Size,d1
mulu d1,d1
sub.w d1,d0
sub.w #10,d0 button number
bsr IncSquare
update movea.l FirstBut,a0
movea.l MyWindow,a1
movea.w #0,a2
move.w Size,d0
mulu d0,d0
CALLINT RefreshGList
move.w Size,d0
mulu d0,d0
cmp.w Count,d0
bne loop
bsr TestWin
bra loop
button cmpi.w #200,d0
beq new
cmpi.w #201,d0
beq retry
cmpi.w #202,d0
beq finish
cmpi.w #203,d0
bne loop
move.w SizeCopy,d0
and.b #IEQUALIFIER_LSHIFT!IEQUALIFIER_RSHIFT,d4
beq cycadd
subq.w #1,d0
cmp.w #2,d0
bne endcyc
move.w #8,d0
bra endcyc
cycadd addq.w #1,d0
cmp.w #9,d0
bne endcyc
move.w #3,d0
endcyc move.w d0,SizeCopy
bra loop
new move.w SizeCopy,Size
move.w #0,Terminate
movea.l MyWindow,a0
lea WinTags,a1
move.w gg_LeftEdge(a0),6(a1)
move.w gg_TopEdge(a0),14(a1)
bra closewind
retry bsr Clear
bra update
closewind movea.l MyWindow,a0
CALLINT CloseWindow
freegads lea glist,a0
CALLGAD FreeGadgets
freetmem move.l Mem2,d0
movea.l TextMem,a1
CALLEXEC FreeMem
freegmem move.l Mem1,d0
movea.l GadMem,a1
CALLEXEC FreeMem
tst.w Terminate
beq Init
freevi move.l VisInfo,a0
CALLGAD FreeVisualInfo
unlock movea.w #0,a0
movea.l PubScr,a1
CALLINT UnlockPubScreen
closegfx move.l _GfxBase,a1
CALLEXEC CloseLibrary
closegad move.l _GadBase,a1
CALLEXEC CloseLibrary
closedos move.l _DOSBase,a1
CALLEXEC CloseLibrary
closeint move.l _IntuitionBase,a1
CALLEXEC CloseLibrary
end rts
; Initialise the random seed
InitRand movem.l d0-d1/a0,-(a7)
movea.l 4,a0
move.l IdleCount(a0),d0
move.l DispCount(a0),d1
rol.l #8,d1
rol.l #8,d1
eor.l d0,d1
move.l d1,Rand
movem.l (a7)+,d0-d1/a0
rts
; Get a random number between d0.b = 0..n-1 and reseed. Returns number in d2.b.
GetRand movem.l d0-d1/d3/a0,-(a7)
clr.w d1
move.b d0,d1
move.w d1,d0
move.l Rand,d1
clr.l d2
move.b d1,d2
divu d0,d2
ror.l #8,d2
ror.l #8,d2 get remainder
andi.l #255,d2 mask off upper 24 bits
ror.l #8,d1
eori.l #$b798a43f,d1
movea.l 4,a0
move.l DispCount(a0),d3
eor.l d3,d1
move.l d1,Rand
movem.l (a7)+,d0-d1/d3/a0
rts
; Increments the square d0.b and its neighbours (if necessary). Returns d4.b=0 if unsuccessful
; (ie. square already occupied).
IncSquare movem.l d0-d3/a0,-(a7)
clr.l d1
move.b d0,d1
move.w d1,d0
divu Size,d1 row
move.w d1,d3
mulu Size,d3
move.w d0,d2
sub.w d3,d2 column
move.b #1,d4
bsr inc
tst.b d4
beq endincsq
addq.w #1,Count
clr.b d4
subq.w #1,d1
bsr inc
addq.w #2,d1
bsr inc
subq.w #1,d1
subq.w #1,d2
bsr inc
addq.w #2,d2
bsr inc
move.b #1,d4
endincsq movem.l (a7)+,d0-d3/a0
rts
; Increments value in button (d1,d2). Tests for invalidity. Doesn't increment if 0 and d4.b=0, or if
; >0 and d4.b=1. Returns d4.b=0 for latter case.
inc cmpi.w #-1,d1
beq incerr
cmpi.w #-1,d2
beq incerr
move.w Size,d3
cmp.w d3,d1
beq incerr
cmp.w d3,d2
beq incerr
mulu d1,d3
add.w d2,d3
add.w d3,d3
add.w ntext,d3
movea.l TextMem,a0
move.b 0(a0,d3.w),d0
cmpi.b #" ",d0
bne incok
tst.b d4
beq incerr
move.b #"1",d0
bra endinc
incok tst.b d4
bne incerr
addq.b #1,d0
cmpi.b #"5",d0
bne endinc
move.b #"1",d0
endinc move.b d0,0(a0,d3.w)
rts
incerr clr.b d4
rts
; Clear the buttons (reset to zero)
Clear movem.l d0/a0,-(a7)
movea.l TextMem,a0
adda.w ntext,a0
move.w Size,d0
mulu d0,d0
clearlp move.b #" ",(a0)
adda.w #2,a0
subq.w #1,d0
bne clearlp
bsr Reset
movem.l (a7)+,d0/a0
rts
; Initialise a new board
Shuffle movem.l d0-d4/a0-a1,-(a7)
movea.l TextMem,a0
movea.l a0,a3
move.w Size,d0
mulu d0,d0
move.w d0,d3
add.w d0,d0
wipe move.b #" ",(a0)
adda.w #2,a0
subq.w #1,d0
bne wipe
movea.l a3,a0
move.w d3,d1
move.w ntext,-(a7)
clr.w ntext
shuflp moveq.b #2,d0
bsr GetRand
move.b d2,d5 direction to move if square is already occupied
move.w d3,d0
bsr GetRand
trynext move.b d2,d0
bsr IncSquare
tst.b d4
bne wasempty
tst.b d5
beq prevsq
addq.b #1,d2
cmp.b d3,d2
bne trynext
clr.b d2
bra trynext
prevsq subq.b #1,d2
cmpi.b #-1,d2
bne trynext
move.b d3,d2
subq.b #1,d2
bra trynext
wasempty subq.w #1,d1
bne shuflp
clr.w Count
move.w (a7)+,ntext
movem.l (a7)+,d0-d4/a0-a1
rts
; Initialise the window title bar and move count
Reset clr.w Count
movea.l MyWindow,a0
lea MainTxt,a1
movea.w #-1,a2
CALLINT SetWindowTitles
rts
; Check to see if the user has won the game, and set the title bar accordingly
TestWin movea.l TextMem,a0
movea.l a0,a1
adda.w ntext,a1
move.w Size,d0
mulu d0,d0
subq.w #1,d0
testlp cmp.w (a0)+,(a1)+
dbne d0,testlp
cmpi.w #-1,d0
beq win
movea.l MyWindow,a0
lea LoseTxt,a1
movea.w #-1,a2
CALLINT SetWindowTitles
rts
win movea.l MyWindow,a0
lea WinTxt,a1
movea.w #-1,a2
CALLINT SetWindowTitles
rts
SECTION Data,DATA
IntName INTNAME
DosName DOSNAME
GfxName GRAFNAME
GadName dc.b "gadtools.library"
DefFont dc.l 0
dc.w 0
dc.b 0,0
Size dc.w 3
WinTags dc.l WA_Left,50
dc.l WA_Top,50
dc.l WA_Width
winwidth dc.l 0
dc.l WA_Height
winheight dc.l 0
dc.l WA_IDCMP,CLOSEWINDOW!GADGETUP!VANILLAKEY
dc.l WA_Gadgets,glist
dc.l WA_Title,MainTxt
dc.l WA_DragBar,1
dc.l WA_DepthGadget,1
dc.l WA_CloseGadget,1
dc.l 0
MainTxt dc.b "Aniso",0
WinTxt dc.b "Well Done!",0
LoseTxt dc.b "Try Again...",0
Buttons dc.w 8,0,0,0
dc.l NewTxt,DefFont
dc.w 200
dc.l PLACETEXT_IN,0,BUTTON_KIND
dc.w 0,0,0,0
dc.l RetryTxt,DefFont
dc.w 201
dc.l PLACETEXT_IN,0,BUTTON_KIND
dc.w 0,0,0,0
dc.l QuitTxt,DefFont
dc.w 202
dc.l PLACETEXT_IN,0,BUTTON_KIND
dc.w 0,0,0,0
dc.l 0,DefFont
dc.w 203
dc.l PLACETEXT_IN,0,CYCLE_KIND
NewTxt dc.b "_New",0
RetryTxt dc.b "_Retry",0
QuitTxt dc.b "_Quit",0
Tag1 dc.l GTTX_Border,1,0
Tag2 dc.l GT_Underscore,"_"
dc.l GTCY_Labels,Array
dc.l GTCY_Active
CycActive dc.l 0,0
Array dc.l a1,a2,a3,a4,a5,a6,0
a1 dc.b "3x3",0
a2 dc.b "4x4",0
a3 dc.b "5x5",0
a4 dc.b "6x6",0
a5 dc.b "7x7",0
a6 dc.b "8x8",0
SECTION Variables,BSS
_IntuitionBase ds.l 1
_DOSBase ds.l 1
_GadBase ds.l 1
_GfxBase ds.l 1
ReturnMsg ds.l 1
SysFont ds.l 1
ScrFont ds.l 1
PubScr ds.l 1
VisInfo ds.l 1
MyWindow ds.l 1
MyIdcmp ds.l 1
CycleGad ds.l 1
FirstBox ds.l 1
FirstBut ds.l 1
sfsize ds.w 1
width ds.l 1
nwidth ds.l 1
height ds.l 1
nheight ds.l 1
ntext ds.w 1
SizeCopy ds.w 1
Rand ds.l 1
GadMem ds.l 1
TextMem ds.l 1
Mem1 ds.l 1
Mem2 ds.l 1
Terminate ds.w 1
Count ds.w 1
glist ds.l 44
end